package com.molichuxing.framework.interceptor;

import com.molichuxing.framework.interceptor.dynamicdatasource.DbContextHolder;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import java.util.List;

/**
 * 
 * @Title: DynamicTransactionInterceptor
 * @Description: 动态事务拦截器，拦截方法后，加入数据源切换的功能
 * @Author: 林亿建
 * @DateTime: 2017年9月6日
 * @Version: 1.0.0
 */
public class DynamicDataSourceInterceptor implements MethodInterceptor {

  private List<String> queryMthods;
  
  public DynamicDataSourceInterceptor(){
    
  }
  
  public DynamicDataSourceInterceptor(List<String> queryMthods){
    this.queryMthods = queryMthods;
  }
  
  public Object invoke(MethodInvocation invocation) throws Throwable {
    /**后期需要扩展DBContextHolder.setJdbcType()中传递的数据源的值为列*/
    //设置数据源
    if(isQueryMethod(invocation.getMethod().getName())){
      //设置只读数据源
      DbContextHolder.setJdbcType("readDataSource");
    }else{
      DbContextHolder.setJdbcType("writeDataSource");
    }
    return invocation.proceed();
  }
  
  /**
   * 
   * @Description:根据方法名判断是否为读数据库操作
   * @param methodName
   * @return 是否为只读数据库方法
   * @author:
   * @time:2015年10月24日 上午11:05:38
   */
  private boolean isQueryMethod(String methodName){
    if("".equals(methodName)){
    return false;
    }
    for(String method:queryMthods){
      if(methodName.startsWith(method)){
        System.out.println(String.format("methodName=%s,切到只读数据源",methodName));
        return true;
      }
    }
    System.out.println(String.format("methodName='%s',切到读写数据源",methodName));
  return false;
  }
  
  /** 
   * @Description: 获取queryMthods
   * @return queryMthods
   */
  public List<String> getqueryMthods() {
    return queryMthods;
  }

  /** 
   * 设置queryMthods
   * @param queryMthods 
   */
  public void setqueryMthods(List<String> queryMthods) {
    this.queryMthods = queryMthods;
  }

}
